/*
 * Systemprogrammierung
 * Multiplayer-Quiz
 *
 * Gemeinsam verwendete Module
 * 
 * rfc.c: Implementierung der Funktionen zum Senden und Empfangen von
 * Datenpaketen gemäß dem RFC
 */

#include <sys/types.h>
#include <sys/socket.h>
#include <stdbool.h>
#include <stdlib.h>
#include "rfc.h"
#include <arpa/inet.h>
#include <netinet/in.h>


/**
 * öffnet Socket für den Server
 *
 * param port Port des Sockets (normal 54321)
 *
 */
int openServerSocket(unsigned short port) {


        //Erstellt Socket auf IPv4
        int login_socket = socket(AF_INET, SOCK_STREAM, 0);

        //Fehler beim Socketerstellen abfangen
        if (login_socket == -1) {
                perror("Socket konnte nicht erstellt werden: ");
                return -1;
        }

        // Struct fuer Socketadresse
        struct sockaddr_in address;

        // Addresseigenschaften
        memset(&address, 0, sizeof(address)); // Erstellt Speicherplatz für Adresse und fuellt mit Nullen
        address.sin_family = AF_INET; // IPv4 Adresse
        address.sin_port = htons(port); // hton sorgt fuer Network-Byte-Order des Ports
        address.sin_addr.s_addr = INADDR_ANY; // Empfaengt von allen Interfaces

        // Socket an den Port binden
        if (bind(login_socket, (struct sockaddr *) &address, sizeof(address)) == -1) {
                perror("bind error:");
                close(login_socket);
                return -1;
        }
        // Gibt Serverport wieder
        infoPrint("Serverport: %d\n", port);
        return login_socket;
}

void packetSchreiben(PACKET packet, int socketDeskriptor){

	if(write(socketDeskriptor, &packet, ntohs(packet.header.length)+3)==-1)//3länge vom Header type+length
	{perror("Error,Verbindung unterbrochen");
		exit(0);
	}else{
		printf("Ein Packet vom Type %i wurde an die SockID: %i versandt\n", packet.header.type, socketDeskriptor);

	}


}


PACKET packetLesen (int socketDeskriptor ){

	PACKET packet;
	packet.header.type = 0;
	packet.header.length = 0;
	int readresult = (int) read(socketDeskriptor,&(packet.header),3);//hängt hier
	// (int) cast Typumwandlung zu integer

	//Socket kann nicht gelesen werden, Fehler
	if( readresult == 0){
		packet.header.type = 0;
		//Socket kann gelesen werden, Übergabe vom content und Länge
	}
	if (readresult== -1){
		perror("Error,Verbindung unterbrochen");
		exit (0);
	}else{//statt read receive nehmen ?
		read(socketDeskriptor, &(packet.content),ntohs(packet.header.length));
	}

	return packet;

}



